package com.suke.czx.common.utils;

import cn.hutool.core.util.StrUtil;

import java.math.BigDecimal;

/**
 * 应用模块名称: 工具类
 * 代码描述: 数值工具类
 * copyright: AUZAR ALL RIGHTS RESERVED
 * company: AUZAR
 *
 * @author: 颜米晨
 * @date: 2022/06/12 1:42
 */
public class NumUtil {

    /**
     * 数值空值转化
     * @param num 数字
     * @return 数值
     */
    public static Integer null2Zero(Integer num) {
        return num != null ? num : 0;
    }

    /**
     * 字符串数字空值转化
     * @param num 字符串数字
     * @return 数值
     */
    public static Integer null2IntegerZero(String num) {
        try {
            return Integer.valueOf(StrUtil.isNotEmpty(num) ? num : "0");
        } catch(Exception e) {
            return 0;
        }
    }

    /**
     * 数值空值转化
     * @param num 数字
     * @return 数值
     */
    public static Double null2DoubleZero(String num) {
        return num != null && num.matches(CommonConstant.NUMBER_REGEX) ? Double.valueOf(num) : 0.0;
    }

    /**
     * 数值空值转化
     * @param num 数字
     * @return 数值
     */
    public static BigDecimal null2BigDecimalZero(Integer num) {
        return null2BigDecimalZero(num, 0);
    }

    /**
     * 数值空值转化
     * @param num 数字
     * @param precision 小数精度
     * @return 数值
     */
    public static BigDecimal null2BigDecimalZero(Integer num, int precision) {
        return null2BigDecimalZero(num, precision, BigDecimal.ROUND_HALF_UP);
    }

    /**
     * 数值空值转化
     * @param num 数字
     * @param precision 小数精度
     * @param roundingMode 舍入方式
     * @return 数值
     */
    public static BigDecimal null2BigDecimalZero(Integer num, int precision, int roundingMode) {
        return num != null ? BigDecimal.valueOf(num).setScale(precision, roundingMode) : BigDecimal.ZERO.setScale(precision, roundingMode);
    }

    /**
     * 数值空值转化
     * @param num 数字
     * @return 数值
     */
    public static BigDecimal null2Zero(Double num) {
        return null2Zero(num, 2);
    }

    /**
     * 数值空值转化
     * @param num 数字
     * @param precision 小数精度
     * @return 数值
     */
    public static BigDecimal null2Zero(Double num, int precision) {
        return null2Zero(num, precision, BigDecimal.ROUND_HALF_UP);
    }

    /**
     * 数值空值转化
     * @param num 数字
     * @param precision 小数精度
     * @param roundingMode 舍入方式
     * @return 数值
     */
    public static BigDecimal null2Zero(Double num, int precision, int roundingMode) {
        return num != null && !Double.isInfinite(num) ? BigDecimal.valueOf(num).setScale(precision, roundingMode)
                : BigDecimal.ZERO.setScale(precision, roundingMode);
    }

    /**
     * 数值空值转化
     * @param num 数字
     * @return 数值
     */
    public static BigDecimal null2Zero(BigDecimal num) {
        return null2Zero(num, 2);
    }

    /**
     * 数值空值转化
     * @param num 数字
     * @param precision 小数精度
     * @return 数值
     */
    public static BigDecimal null2Zero(BigDecimal num, int precision) {
        return null2Zero(num, precision, BigDecimal.ROUND_HALF_UP);
    }

    /**
     * 数值空值转化
     * @param num 数字
     * @param precision 小数精度
     * @param roundingMode 舍入方式
     * @return 数值
     */
    public static BigDecimal null2Zero(BigDecimal num, int precision, int roundingMode) {
        return num != null ? num.setScale(precision, roundingMode) : BigDecimal.ZERO.setScale(precision, roundingMode);
    }

    /**
     * 数值空值转化
     * @param num 数字
     * @return 数值
     */
    public static BigDecimal null2Zero(String num) {
        return null2Zero(num, 2);
    }

    /**
     * 数值空值转化
     * @param num 数字
     * @param precision 小数精度
     * @return 数值
     */
    public static BigDecimal null2Zero(String num, int precision) {
        return null2Zero(num, precision, BigDecimal.ROUND_HALF_UP);
    }

    /**
     * 数值空值转化
     * @param num 数字
     * @param precision 小数精度
     * @param roundingMode 舍入方式
     * @return 数值
     */
    public static BigDecimal null2Zero(String num, int precision, int roundingMode) {
        return num != null && num.matches(CommonConstant.NUMBER_REGEX) ? new BigDecimal(num).setScale(precision, roundingMode)
                : BigDecimal.ZERO.setScale(precision, roundingMode);
    }

    /**
     * 数值选择
     * @param num1 数值1
     * @param num2 数值2
     * @return 合格数值
     */
    public static BigDecimal nvlNum(BigDecimal num1, BigDecimal num2) {
        return nvlNum(num1, num2, 2);
    }

    /**
     * 数值选择
     * @param num1 数值1
     * @param num2 数值2
     * @param precision 小数精度
     * @return 合格数值
     */
    public static BigDecimal nvlNum(BigDecimal num1, BigDecimal num2, int precision) {
        return nvlNum(num1, num2, precision, BigDecimal.ROUND_HALF_UP);
    }

    /**
     * 数值选择
     * @param num1 数值1
     * @param num2 数值2
     * @param precision 小数精度
     * @param roundingMode 舍入方式
     * @return 合格数值
     */
    public static BigDecimal nvlNum(BigDecimal num1, BigDecimal num2, int precision, int roundingMode) {
        return num1 != null ? num1 : (num2 != null ? num2 : BigDecimal.ZERO).setScale(precision, roundingMode);
    }

    /**
     * 数值选择(允许0)
     * @param num1 数值1
     * @param num2 数值2
     * @return 合格数值
     */
    public static BigDecimal nvlZeroNum(Double num1, Double num2) {
        return nvlZeroNum(num1, num2, 2);
    }

    /**
     * 数值选择(允许0)
     * @param num1 数值1
     * @param num2 数值2
     * @param precision 小数精度
     * @return 合格数值
     */
    public static BigDecimal nvlZeroNum(Double num1, Double num2, int precision) {
        return nvlZeroNum(num1, num2, precision, BigDecimal.ROUND_HALF_UP);
    }

    /**
     * 数值选择(允许0)
     * @param num1 数值1
     * @param num2 数值2
     * @param precision 小数精度
     * @param roundingMode 舍入方式
     * @return 合格数值
     */
    public static BigDecimal nvlZeroNum(Double num1, Double num2, int precision, int roundingMode) {
        return BigDecimal.valueOf(num1 != null ? num1 : (num2 != null ? num2 : 0)).setScale(precision, roundingMode);
    }

    /**
     * 数值比较大小
     * @param comparator1 数值1
     * @param comparator2 数值2
     * @return 数值大者
     */
    public static Integer gtInt(Integer comparator1, Integer comparator2) {
        return null2Zero(comparator1) >= null2Zero(comparator2) ? comparator1 : comparator2;
    }

    /**
     * 数值比较大小
     * @param comparator1 数值1
     * @param comparator2 数值2
     * @return 数值大者
     */
    public static BigDecimal gtBigDecimal(BigDecimal comparator1, BigDecimal comparator2) {
        return null2Zero(comparator1).compareTo(comparator2) >= 0 ? comparator1 : comparator2;
    }

}
